package com.ruoyi.client.fxiaoke.service;

import java.util.List;
import java.util.Map;

import com.ruoyi.client.fxiaoke.beans.args.CrmQueryV2Arg;
import com.ruoyi.client.fxiaoke.beans.args.CrmUpdateArg;
import com.ruoyi.client.fxiaoke.beans.results.BaseResult;
import com.ruoyi.client.fxiaoke.beans.results.CrmResult;
import com.ruoyi.client.fxiaoke.exception.AccessTokenException;
/**
 * CRM预定义对象
 * @author 官宇
 * @date 2020-05-20
 */
public interface CRMService {
	
	/**
	 * 根据api名称获取所有数据
	 * @return
	 * @throws AccessTokenException 
	 * @throws Exception 
	 */
	public List<Map<String, Object>> getDataAll(String apiName) throws Exception;
	
	/**
	 * 获取crm列表数据
	 * @param arg
	 * @return
	 * @throws Exception 
	 */
	public List<Map<String,Object>> getData(CrmQueryV2Arg arg) throws Exception;
	
	/**
	 *	获取crm列表数据
	 * @param arg 查询参数
	 * @param offset 偏移量
	 * @return
	 * @throws Exception 
	 */
	public List<Map<String, Object>> getData(CrmQueryV2Arg arg, Double offset) throws Exception;
	
	/**
	 * 根据单据ID获取单据数据
	 * @param apiName	API对象名
	 * @param dataId	数据ID
	 * @return
	 * @throws Exception
	 */
	public Map<String,Object> getById(String apiName,String dataId) throws Exception;
	
	/**
	 * 根据单据编号查询数据
	 * @param apiName		接口名称
	 * @param codeField		编码字段
	 * @param code			编码
	 * @return
	 * @throws AccessTokenException 
	 * @throws Exception 
	 */
	public Map<String,Object> getByCode(String apiName,String codeField,String code) throws Exception;
	
	/**
	 * 查询接口
	 * @param apiName		接口名称
	 * @param param		查询参数
	 * @return
	 * @throws Exception 
	 */
	public List<Map<String,Object>> query(String apiName,Map<String,Object> param) throws Exception;
	
	/**
	 * 根据外键查询
	 * @param apiName	API名称
	 * @param pkName	外建名称
	 * @param dataId	外建值
	 * @return
	 * @throws Exception 
	 */
	public List<Map<String,Object>> getByRefId(String apiName,String pkName,String dataId) throws Exception;
	
	/**
	 * 获取所有 CRM基础接口
	 * @return
	 * @throws AccessTokenException 
	 * @throws Exception 
	 */
	public List<Map<String,Object>> getObjectList() throws Exception;

	/**
	 * 根据API名称获取crm基础对象
	 * @param apiName
	 * @return
	 */
	public Map<String,Object> getApiModel(String apiName);
	
	/**
	 * 修改crm数据
	 * @param arg
	 * @throws Exception 
	 */
	public void update(CrmUpdateArg arg) throws Exception;
	
	/**
	 * 添加CRM数据
	 */
	public String create(CrmUpdateArg arg) throws Exception;
	
	/**
	 * 保存CRM数据
	 * @param arg
	 * @return
	 * @throws Exception
	 */
	public CrmResult save(CrmUpdateArg arg) throws Exception;
	
	/**
	 * 添加CRM数据
	 * @param apiName		API对象名称
	 * @param dataMap		对象数据
	 * @return	单据主键
	 * @throws Exception
	 */
	public String save(String apiName,Map<String,Object> dataMap) throws Exception;
	
	/**
	 * 根据主键作废对象数据
	 * @param apiName		API对象名称
	 * @param dataId		单据主键
	 * @return 
	 * @throws Exception
	 */
	public BaseResult invalidById(String apiName,Object dataId) throws Exception;
	
	/**
	 * 根据主键删除对象数据
	 * @param apiName		API对象名称
	 * @param dataId		单据主键
	 * @return 
	 * @throws Exception
	 */
	public BaseResult deleteById(String apiName,Object dataId) throws Exception;
	
}
